"""
配置文件，设置服务配置，读取配置
"""

import yaml
import os
import sys


def get_packed_support_path(relative_path):
    """ 获取支持打包的资源文件的路径，不打包/打包都能索引到资源文件 """
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.dirname(__file__), relative_path)


def get_current_path(relative_path: str = None):
    """ 获取当前项目所在目录的绝对路径，如果项目被打包，获取执行文件的绝对路径 """
    path = sys.argv[0]
    path = path.replace('\\', '/')
    paths = path.split('/')[:-1]
    path = '/'.join(paths)
    if relative_path:
        path += '/' + relative_path.strip('/')
    return path


class Dic2Ob(dict):
    """ 将字典转成对象 """

    def __getattr__(self, key):
        value = self.get(key)
        return Dic2Ob(value) if isinstance(value, dict) else value

    def __setattr__(self, key, value):
        self[key] = value


class Config:
    """ 
    配置文件:
        
        .config: /config.yml配置文件对象，记录一些项目和运行配置
        .config_apidoc: /config_apidoc.yml配置文件对象，记录一些接口文档配置
        .project_config: 自动识别 测试/生产 环境配置文件对象，记录一些项目和运行配置
    """
    config: Dic2Ob = None  # 配置文件
    config_base: Dic2Ob = None  # 基础配置文件
    config_apidoc: Dic2Ob = None  # apidoc配置文件
    config_project: Dic2Ob = None  # 项目配置文件
    config_plugin: Dic2Ob = None  # 插件配置文件

    def __init__(self, path=get_current_path()) -> None:
        if not self.config_base:
            path = path or '.'
            self.__class__.config = config_reader(path + '/config.yml')
            self.__class__.config_base = self.__class__.config.基础配置
            self.__class__.config_project = self.__class__.config.项目配置
            self.__class__.config_plugin = self.__class__.config_base.plugin
            self.__class__.config_apidoc = config_reader(path + '/config_apidoc.yml')


def config_reader(path='config.yml'):
    """
    读取配置文件，目前只能读取yaml配置文件
    @param
        :path: <str> | default_value: 'config.yml'。 配置文件路径和名称
    @return
        : <Dic2Ob>,一个字典对象。可以通过object.attr或者object[attr]方式读取属性，前者结果还是Dic2Ob, 后者结果是dict
    """
    if os.path.exists(path):
        doc = open(path, 'r', encoding='utf-8')
        doc_dict = yaml.load(doc, Loader=yaml.FullLoader)
        config = Dic2Ob(doc_dict)
        return config
    else:
        print("读取配置文件失败，请检查文件路径：{}".format(path))
        return None


Config()
baseconfig = Config.config_base
projectconfig = Config.config_project
pluginconfig = Config.config_plugin
apidocconfig = Config.config_apidoc
__all__ = [
    baseconfig,
    projectconfig,
    pluginconfig,
    apidocconfig,
    config_reader,
    Dic2Ob,
    get_current_path,
    get_packed_support_path
]
